package projorientado.ocr.vfeature.impl.comparator;

import projorientado.ocr.vfeature.FeaturesComparator;
import projorientado.ocr.vfeature.SequentialFeatures;

public class EuclideanComparator implements FeaturesComparator {

    public static final EuclideanComparator instance = new EuclideanComparator();

    public float compareFeatures(SequentialFeatures s1, SequentialFeatures s2) {
        int len = s1.featuresSize();
        float ret = 0;
        for(int i = 0; i < len; i++) {
            float v = Math.abs(s1.getFeature(i) - s2.getFeature(i));
            ret += v*v;
        }
        
        // sqtr(ret) = distância euclidiana da imagem da outra,
        // considerando que cada ponto representa uma coordenada em uma dimensão.
        // analisando que para efeitos de comparação, não é a distância propriamente
        // dita que será relevante, então para diminuir esforços computacionais
        // não será realizado a raiz quadrada, pois sqtr(ret1) > sqtr(ret2) então
        // ret1 > ret2.
        // para manter a proporcionalidade entre diversos tamanhos de imagem, será usado
        // porcentagem, 100*ret/total, sendo o total width*height, pois mesmo que
        // a diferença de cada posição seja 1, o máximo será width*hegiht. E o mínimo 0.
        
        return (100*ret)/(len);
    }
}
